/**
 * Created by yezh1 on 2017-11-17.
 */
import {
  toPairsIn,
  toPairs,
  isElement,
  cloneDeep,
  isNumber,
  isString,
  isEmpty
} from 'lodash'
let obj = {}
/**
 * 对象合并 深拷贝
 * @param des
 * @param src
 * @param override
 * @returns {*}
 */
obj.deepExtend = (des, src) => {
  if (Array.isArray(src)) {
    if (Array.isArray(des)) {
      for (let i = 0; i < src.length; i++) {
        if (src[i] instanceof Object) {
          des[i] = obj.deepExtend(des[i], src[i])
        } else {
          des[i] = src[i]
        }
      }
    } else {
      des = [].concat(src)
    }
  } else if (src instanceof Object && !Array.isArray(src)) {
    if (des instanceof Object && !Array.isArray(des)) {
      for (let key of Object.keys(src)) {
        if (src[key] instanceof Object) {
          des[key] = obj.deepExtend(des[key], src[key])
        } else {
          des[key] = src[key]
        }
      }
    } else {
      des = Object.assign({}, src)
    }
  } else {
    des = src
  }

  return des
}
/**
 * 对象深拷贝
 * @param des 目标对象
 * @param src 源对象
 * @param override
 * @returns {*}
 */
// obj.deepCopy = (des, src) => {
//   let d = des || {}
//   for (let i in src) {
//     if (typeof src[i] === 'object') {
//       d[i] = (src[i].constructor === Array) ? [] : {}
//       obj.deepCopy(src[i], d[i])
//     } else {
//       d[i] = src[i]
//     }
//   }
//   return d
// }

/**
 * 把对象可枚举属性组成键值对数组
 * @param src 源对象
 * @param containInhert 是否操作对象所继承的键值对(prototype)
 * @returns {*}
 */
obj.toPairs = (src, containInhert) => {
  if (obj && typeof obj === 'object') {
    if (containInhert) {
      return toPairsIn(src)
    } else {
      return toPairs(src)
    }
  } else {
    return []
  }
}

/**
 * 对象深拷贝（不能拷贝vueComponent）
 * @param src 源对象
 * @returns {*}
 */
obj.deepCopy = src => {
  let res
  if (src) {
    if (!isElement(src)) {
      try {
        res = cloneDeep(src)
      } catch (e) {
        console.log('deepCopy Exception', e)
        return {}
      }
    } else {
      console.log('deepCopy Error: 无法拷贝dom对象')
      return false
    }
  } else {
    res = {}
  }
  return res
}
/**
 * 对象合并
 * @param des
 * @param src
 * @param override
 * @returns {*}
 */
obj.extend = (des, src, override) => {
  if (src instanceof Array) {
    for (let i = 0, len = src.length; i < len; i++) {
      obj.extend(des, src[i], override)
    }
  }
  for (let i in src) {
    if (override || !(i in des)) {
      des[i] = src[i]
    }
  }
  return des
}
/**
 * 判断字符串是否为json格式
 * @param str
 * @returns {boolean}
 */
obj.isJSON = str => {
  if (typeof str === 'string') {
    try {
      JSON.parse(str)
      if (str.indexOf('{') > -1) {
        return true
      } else {
        return false
      }
    } catch (e) {
      return false
    }
  } else {
    str = JSON.stringify(str)
    obj.isJSON(str)
  }
  return false
}

/**
 * 判断非空,
 * @param val
 * @returns {Boolean}
 */
// obj.isEmpty = (val) => {
//   if (val == null) {
//     return true
//   }
//   if (val == undefined || val == 'undefined') {
//     return true
//   }
//   if (val === '') {
//     return true
//   }
//   if (val.length === 0) {
//     return true
//   }
//   if (typeof (val) == 'object' && JSON.stringify(val) == '{}') {
//     return true
//   }
//   if (!/[^(^\s*)|(\s*$)]/.test(val)) {
//     return true
//   }
//   return false
// }
/**
 * 判断非空,
 * @param val (string|object|array)
 * @returns {Boolean}
 */
obj.isEmpty = src => {
  if (isNumber(src)) {
    return false
  }
  if (isString(src)) {
    if (!/[^(^\s*)|(\s*$)]/.test(src)) {
      return true
    } else {
      return false
    }
  }
  return isEmpty(src)
}

export default obj
